jsonbeat
A step of JSON transforming flow
Install
npm install --save jsonbeat
Example
Define the transformer
var jsonbeat = require('jsonbeat');
var billSchema = {
name: 'Summary',
inputSchema: {
"type": "object",
"properties": {
"title": { "type": "string" },
"fromTime": { "type": "string" },
"toTime": { "type": "string" },
"customerId": { "type": "string" },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": { "type": "string" },
"price": { "type": "number" },
"amount": { "type": "number" }
},
"required": ["label", "price", "amount"]
}
}
}
},
transform: function(data) {
var summary = data.items.reduce(function(sum, item) {
sum.count += item.amount;
sum.total += item.amount * item.price;
return sum;
}, { count: 0, total: 0 });
return {
title: data.title + ' [' + data.customerId + ']',
customerId: data.customerId,
count: summary.count,
total: summary.total
}
},
outputSchema: {
"type": "object",
"properties": {
"title": { "type": "string" },
"customerId": { "type": "string" },
"count": { "type": "number", "minimum": 0 },
"total": { "type": "number" }
}
}
};
var billSchemaCallback = Object.assign({}, billSchema, {
transform: function(data, callback) {
var summary = data.items.reduce(function(sum, item) {
sum.count += item.amount;
sum.total += item.amount * item.price;
return sum;
}, { count: 0, total: 0 });
var ret = {
title: data.title + ' [' + data.customerId + ']',
customerId: data.customerId,
count: summary.count,
total: summary.total
}
callback && callback(null, ret);
}
});
var billingSchemaPromise = Object.assign({}, billingSchema, {
transform: function(data) {
return new Promise(function(resolve, reject) {
var summary = data.items.reduce(function(sum, item) {
sum.count += item.amount;
sum.total += item.amount * item.price;
return sum;
}, { count: 0, total: 0 });
setTimeout(function() {
resolve({
title: data.title + ' [' + data.customerId + ']',
customerId: data.customerId,
count: summary.count,
total: summary.total
});
}, 100);
})
}
});
var transformer1 = new jsonbeat(billSchema);
transformer1.on('output', function(result) {
console.log('Summary (transformer1): %s', JSON.stringify(result));
});
var transformer2 = new jsonbeat(billSchemaCallback);
transformer2.on('output', function(result) {
console.log('Summary (transformer2): %s', JSON.stringify(result));
});
var transformer3 = new jsonbeat(billSchemaPromise);
transformer3.on('output', function(result) {
console.log('Summary (transformer3): %s', JSON.stringify(result));
});
Use the transformer
var result = transformer1.pushSync({
title: 'JsonBeat Billing',
customerId: 'hello.com',
items: [
{ label: 'Item#1', price: 15, amount: 2 },
{ label: 'Item#2', price: 17, amount: 3 }
]
});
console.log('pushSync() output: %s', JSON.stringify(result, null, 2));
transformer2.push({
title: 'JsonBeat Billing',
customerId: 'hello.com',
items: [
{ label: 'Item#1', price: 15, amount: 2 },
{ label: 'Item#2', price: 17, amount: 3 }
]
}).then(function(summary) {
console.log('push() output: %s', JSON.stringify(summary, null, 2));
}).catch(function(err) {
console.log('push() error: %s', JSON.stringify(err, null, 2));
});
transformer3.push({
title: 'JsonBeat Billing',
customerId: 'hello.com',
items: [
{ label: 'Item#1', price: 15, amount: 2 },
{ label: 'Item#2', price: 17, amount: 3 }
]
}, {}, function(err, summary) {
if (err) {
console.log('push() error: %s', JSON.stringify(err, null, 2));
}
console.log('push() output: %s', JSON.stringify(summary, null, 2));
});